GoLand
asIDE
DevCloud
asgo run/go build/dlv debug
environment
前言
缘起一个
EOF
错误,由于网络策略原因,本地开发机无法连接某个内网服务,遂转向在办公网内的远程服务器。本人作为 Linux 小菜,由此产生了一个新诉求:在 Windows 上远程开发和调试服务器的代码,充分地发挥 IDE 的强大作用。
环境准备
本地环境
- GoLand 2020.2.3
远程环境
- Go 1.16.6
- Delve 1.7.0
配置 GoLand 连接 DevCloud
创建 Deployment 配置
Tools
->Deployment
->Configuration
->+
Connection - 网络连接
Type
:选择SFTP
协议SSH configuration
:填写Host
/Port
/User name
/Password
信息,通过Test Connection
验证Root path
:点击Autodetect
按钮Web server URL
:暂时不用考虑
Mappings - 存储映射
Local path
:本地开发机项目目录
Deployment path
:远程服务器项目目录
Web path
:暂时不用考虑
创建 Run/Debug 配置
Run
->Edit Configurations
->+
->Go Remote
Host
:远程服务器地址
Port
:Delve Port
登录、查看和同步
登录远程服务器
Tool
->Start SSH Session
查看远程目录树
Tools
->Deployment
->Browse Remote Host
同步本地文件夹
手动:
Tools
->Deployment
->Sync with Deployed to DevCloud
自动:
Tools
->Deployment
->Automatic Upload (on explicit save)
部署与调试
远程执行部署脚本
编译调试一起
1 | dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 |
先编译再调试
1 | go build -o cmd/server/demo.exe cmd/server/main.go |
进程后台操作
1 | nohup dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 >> ./demo.log 2>&1 & # 后台启动 |
完整脚本文件
start.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/bash
# set go env
export GO111MODULE=auto
export GOPROXY=https://goproxy.io,direct
go mod tidy
go mod vendor
# kill processes already started
pkill -9 dlv
# run demo backgroud server
nohup dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 >> ./demo.log 2>&1 &
echo 'nohup dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 >> ./demo.log 2>&1 &'stop.sh
1
2
3
4#!/bin/bash
# kill processes already started
pkill -9 dlv
本地打开调试模式
PS:这里需要注意,
go run
的时候返回数据到Postman
,dlv debug
的时候返回数据到GoLand
具体流程
- 配置好
Deployment
和Run/Debug
- 修改本地代码文件,手动或自动同步内容到远程
- 登录远程服务器,一键执行部署脚本
- 本地打好断点,开启调试模式
附录
GoLand Debug
- 开启调试模式:
Shift + F9
- 打下断点:点击 Code 左侧
- 查看变量:查看 Debug 面板
Step Over
:F8
Step Into
:F7
Step Out
:Shift + F8
- 下一个断点处:
F9
Delve Debug
- 开启调试模式:
dlv debug main.go
- 打下断点:
break pkg.fn
或break file:line
- 查看变量:
print var
或args
或locals
Step Over
:next
Step Into
:step
Step Out
:stepout
- 下一个断点处:
continue